home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / ms-0_06.lha / xms-0.06 / main.c < prev    next >
C/C++ Source or Header  |  1991-10-17  |  6KB  |  192 lines

  1. /* main.c - main program for MandelSpawn */
  2.  
  3. /*  This file is part of MandelSpawn, a parallel Mandelbrot program for
  4.     the X window system.
  5.  
  6.     Copyright (C) 1990, 1991 Andreas Gustafsson
  7.  
  8.     MandelSpawn is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License, version 1,
  10.     as published by the Free Software Foundation.
  11.  
  12.     MandelSpawn is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License,
  18.     version 1, along with this program; if not, write to the Free 
  19.     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <X11/Intrinsic.h>
  24. #include <X11/Shell.h>
  25. #include <X11/Xos.h>    /* just for rindex() declaration / macro */
  26. #include <X11/StringDefs.h>
  27.  
  28. #include "backward.h"    /* X11R2 backward compatibility stuff */
  29.  
  30. #include "Mama.h"
  31. #include "Ms.h"
  32.  
  33. #include "version.h"
  34.  
  35. static XrmOptionDescRec options[] = {
  36.     {"-center",         "*center_box", XrmoptionNoArg, "True" },
  37.     {"-chunk_width",     "*chunk_width", XrmoptionSepArg, NULL },
  38.     {"-chunk_height",     "*chunk_height", XrmoptionSepArg, NULL },
  39.     {"-colors",         "*colours",    XrmoptionSepArg, NULL }, 
  40.     {"-colours",     "*colours",    XrmoptionSepArg, NULL },
  41.     {"-cursor",         "*cursor",     XrmoptionSepArg, NULL },
  42.     {"-geometry",     "*ms_1.geometry", XrmoptionSepArg, NULL },
  43.     {"-iterations",     "*hues",    XrmoptionSepArg, NULL },
  44.     {"-nocenter",     "*center_box", XrmoptionNoArg, "False" },
  45.     {"-spectrum",     "*spectrum",    XrmoptionSepArg, NULL },
  46.     {"-greyscale",     "*spectrum",    XrmoptionNoArg, "white-black" },
  47.     {"-grayscale",     "*spectrum",    XrmoptionNoArg, "white-black" },
  48.     {"-x",         "*ms_1*center_x", XrmoptionSepArg, NULL },
  49.     {"-y",         "*ms_1*center_y", XrmoptionSepArg, NULL },
  50.     {"-range",         "*ms_1*range",    XrmoptionSepArg, NULL },
  51.     {"-julia",         "*ms_1*julia",    XrmoptionNoArg, "True" },
  52.     {"-cx",         "*ms_1*c_x",    XrmoptionSepArg, NULL },
  53.     {"-cy",         "*ms_1*c_y",    XrmoptionSepArg, NULL },
  54.     {"-bw",         "*bw",        XrmoptionNoArg, "True" },
  55.     {"-wrap",         "*wrap",    XrmoptionNoArg, "True" },
  56.     {"-nowrap",         "*wrap",    XrmoptionNoArg, "False" },
  57.     {"-interior",     "*interior",    XrmoptionNoArg, "True" },
  58.     {"-sony",         "*sony_bug_workaround",
  59.                                XrmoptionNoArg, "True" },
  60.     {"-crosshair_size",     "*ms_1*crosshair_size",
  61.                                        XrmoptionSepArg, NULL }
  62. };
  63.  
  64.  
  65. /* Ugly global state */
  66.  
  67. XtAppContext thisApp;
  68. Display *myDisplay;
  69. Screen *myScreen;
  70.  
  71.  
  72. /* Genereate a usage message */
  73.  
  74. static void
  75. Usage(name)
  76. String name;
  77. { int i;
  78.   fprintf(stderr, "usage: %s ", name);
  79.   for(i=0; i<XtNumber(options); i++)
  80.   { printf("[%s%s]%s", options[i].option,
  81.        options[i].argKind==XrmoptionSepArg ? " ..." : "",
  82.        i==XtNumber(options)-1 ? "\n" :
  83.          i%4==3 ? "\n\t" : " ");
  84.   }
  85.   exit(1);
  86. }
  87.  
  88.  
  89. #ifdef R4
  90. /* Type converter from String to Double - why on Earth isn't */
  91. /* this in Xt?  There is a converter from String to Float that */
  92. /* first converts a string to a double and then goes to the */
  93. /* additional trouble of truncating it into a float... but not */
  94. /* one returning a double. */
  95.  
  96. #define    done(type, value) \
  97.     {                            \
  98.         if (toVal->addr != NULL) {                \
  99.         if (toVal->size < sizeof(type)) {        \
  100.             toVal->size = sizeof(type);            \
  101.             return False;                \
  102.         }                        \
  103.         *(type*)(toVal->addr) = (value);        \
  104.         }                            \
  105.         else {                        \
  106.         static type static_val;                \
  107.         static_val = (value);                \
  108.         toVal->addr = (XtPointer)&static_val;        \
  109.         }                            \
  110.         toVal->size = sizeof(type);                \
  111.         return True;                    \
  112.     }
  113.  
  114.  
  115. static Boolean CvtStringToDouble(dpy, args, num_args,
  116.                  fromVal, toVal, closure_ret)
  117.      Display* dpy;
  118.      XrmValuePtr args;
  119.      Cardinal *num_args;
  120.      XrmValuePtr fromVal;
  121.      XrmValuePtr toVal;
  122.      XtPointer    *closure_ret;
  123. { double d;
  124.   double atof();
  125.   if (*num_args != 0)
  126.     XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
  127.             "wrongParameters", "cvtStringToDouble", "XtToolkitError",
  128.             "String to Double conversion needs no extra arguments",
  129.             (String *) NULL, (Cardinal *) NULL);
  130.   
  131.   d = atof(fromVal->addr);
  132.   done(double, d);
  133. }
  134. #endif
  135.  
  136.  
  137. main(argc, argv)
  138.   int argc; char *argv[];
  139. {
  140.     Widget toplevel;
  141.     MamaWidget theMama;
  142.     char *name;
  143.     Arg arglist[12];
  144.     int num_args;
  145.     Arg shell_arglist[12];
  146.     int num_shell_args;
  147.  
  148.     if (name = rindex(argv[0], '/')) name++;
  149.     else name = argv[0];
  150.  
  151.     toplevel = XtInitialize(NULL, "Ms", 
  152.                 options, XtNumber(options),
  153.                 &argc, argv);
  154.     thisApp=XtWidgetToApplicationContext(toplevel);
  155.     myDisplay=XtDisplay(toplevel);
  156.     myScreen=ScreenOfDisplay(myDisplay, DefaultScreen(myDisplay));
  157.  
  158.     if (argc == 2 && !strcmp(argv[1], "-version"))
  159.       printf("MandelSpawn version %s\n", ms_version);
  160.     else
  161.       if (argc != 1)
  162.     Usage(name);
  163.  
  164. #ifdef R4
  165.     XtAppSetTypeConverter(thisApp, XtRString, XtRDouble, CvtStringToDouble,
  166.               NULL, 0, XtCacheAll, NULL);
  167. #endif
  168.  
  169.     theMama=(MamaWidget) 
  170.       XtCreateManagedWidget("mama",
  171.                 (WidgetClass) mamaWidgetClass, 
  172.                 (Widget) toplevel, 
  173.                 (ArgList) NULL, 
  174.                 0);
  175.  
  176. #ifdef MENU
  177.     XawSimpleMenuAddGlobalActions(thisApp);
  178. #endif
  179.  
  180.     /* we supply no arguments to the shell, but the PopupAnother */
  181.     /* function does, so we need to pass a real buffer (not NULL) */
  182.     num_shell_args=0;
  183.  
  184.     /* create an initial child with default settings */
  185.     num_args=0;
  186.     XtSetArg(arglist[num_args], XtNMama, theMama); num_args++;
  187.     PopupAnother(theMama, shell_arglist, num_shell_args, arglist, num_args);
  188.  
  189.     XtMainLoop();
  190.     return(0); /* keep lint happy */
  191. }
  192.